package v1_from

import (
	"context"
	"reflect"
	"strings"
)

// Selector 上面实现 From where 等 select 语句的方法，最终通过实现 build 方法 构建出Query对象
// Selector 还需要实现 Querier 接口
// 而 Querier接口上面 只定义最终的方法(Get、GetMulti)
// 最终的调用形式就是：NewSelector().From(...).Where(...).Order(...).....build().(Get(ctx)/GetMulti(ctx))
// NewSelector().From(...).Where(...).Order(...).....build() 用于构造 SQL; .(Get(ctx)/GetMulti(ctx)) 用于将结果转换成结构体
type Selector[T any] struct {
	table string
}

func (s *Selector[T]) Get(ctx context.Context) (*T, error) {
	//TODO implement me
	panic("implement me")
}

func (s *Selector[T]) GetMulti(ctx context.Context) ([]*T, error) {
	//TODO implement me
	panic("implement me")
}

func (s *Selector[T]) From(table string) *Selector[T] {
	s.table = table
	return s
}

func (s *Selector[T]) Build() (*Query, error) {
	var sb = strings.Builder{}
	sb.WriteString("SELECT * FROM ")
	if s.table == "" {
		var t T
		sb.WriteByte('`')
		sb.WriteString(reflect.TypeOf(t).Name())
		sb.WriteByte('`')
	} else {
		sb.WriteString(s.table)
	}
	sb.WriteString(";")
	return &Query{
		SQL: sb.String(),
	}, nil

}

func NewSelector[T any]() *Selector[T] {
	return &Selector[T]{}
}
